﻿using ArtMath.Core.Helper;
using ArtMath.Resource;
using ArtMath.Setting;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ArtMath.Data
{
    [Serializable]
    public class ColorX// : IFormatPainter<ColorX>
    {
        Color cl, rcl;
        public bool ReverseTransparency, AllowTransparency = true;
        //public event Action ColorChanged;
        SketchPad pad;
        public ColorX(SketchPad pad)
        {
            this.pad = pad;
        }
        public ColorX(SketchPad pad, Color color) : this(pad)
        {
            Color = color;
        }
        public Color Color
        {
            get { return cl; }
            set
            {
                if (!AllowTransparency && value.A != 255)
                {
                    MessageBox.Show(Resources.Translate("NotAllowTransparent"), Resources.Translate("Exclamation"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                cl = value;
                rcl = cl.GetReversedColor(ReverseTransparency);
                //ColorChanged?.Invoke();
                pad.Canvas.Invalidate();
            }
        }
        public Color ReversedColor
        {
            get { return Settings.Instance.DisableReversedColorWhenEqualsPadBGColor && rcl.BaseColorEquals(pad.BackgroundColor) ? cl : rcl; }
        }
        public override string ToString()
        {
            return cl.ToString();
        }

        //public void UseFormat(ColorX obj)
        //{
        //    cl = obj.cl;
        //    rcl = obj.rcl;
        //    ReverseTransparency = obj.ReverseTransparency;
        //    AllowTransparency = obj.AllowTransparency;
        //}
    }
    //public class ColorX
    //{
    //    StringX a, r, g, b;
    //    public bool ReverseTransparency = false, AllowTransparency = true;
    //    public event Action ColorChanged;
    //    public ColorX(SketchPad pad, string description, Color color)
    //    {
    //        a = new StringX(pad, description + "的 Alpha 分量值", color.A.ToString());
    //        a.ParametersValueChanged += ARGBParametersValueChanged;
    //        a.ExpressionSet += ARGBExpressionSet;
    //        r = new StringX(pad, description + "的 Red 分量值", color.R.ToString());
    //        r.ParametersValueChanged += ARGBParametersValueChanged;
    //        r.ExpressionSet += ARGBExpressionSet;
    //        g = new StringX(pad, description + "的 Green 分量值", color.G.ToString());
    //        g.ParametersValueChanged += ARGBParametersValueChanged;
    //        g.ExpressionSet += ARGBExpressionSet;
    //        b = new StringX(pad, description + "的 Blue 分量值", color.B.ToString());
    //        b.ParametersValueChanged += ARGBParametersValueChanged;
    //        b.ExpressionSet += ARGBExpressionSet;
    //    }

    //    void ARGBExpressionSet(StringX sender, double oldValue)
    //    {
    //        if (sender == a && !AllowTransparency)
    //        {
    //            MessageBox.Show("此颜色不允许透明！", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    //            sender.SetExpression(255);
    //        }
    //        else
    //        {
    //            if (sender.Value < 0)
    //            {
    //                MessageBox.Show("A, R, G, B四个分量值不在范围0~255内。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    //                sender.SetExpression(0);
    //            }
    //            else if (sender.Value > 255)
    //            {
    //                MessageBox.Show("A, R, G, B四个分量值不在范围0~255内。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    //                sender.SetExpression(255);
    //            }
    //        }
    //        ColorChanged?.Invoke();
    //    }

    //    void ARGBParametersValueChanged(StringX sender, double oldValue)
    //    {
    //        if (sender == a && !AllowTransparency)
    //        {
    //            sender.SetExpression(255);
    //        }
    //        else
    //        {
    //            if (sender.Value < 0)
    //            {
    //                sender.SetExpression(0);
    //            }
    //            else if (sender.Value > 255)
    //            {
    //                sender.SetExpression(255);
    //            }
    //        }
    //        ColorChanged?.Invoke();
    //    }
    //    [MultilingualCategory("Structure")]
    //    public StringX A
    //    {
    //        get { return a; }
    //        set { a = value; }
    //    }
    //    [MultilingualCategory("Structure")]
    //    public StringX R
    //    {
    //        get { return r; }
    //        set { r = value; }
    //    }
    //    [MultilingualCategory("Structure")]
    //    public StringX G
    //    {
    //        get { return g; }
    //        set { g = value; }
    //    }
    //    [MultilingualCategory("Structure")]
    //    public StringX B
    //    {
    //        get { return b; }
    //        set { b = value; }
    //    }
    //    [MultilingualCategory("Structure")]
    //    public Color 颜色
    //    {
    //        get { return Color.FromArgb((int)a.Value, (int)r.Value, (int)g.Value, (int)b.Value); }
    //        set
    //        {
    //            a.SetExpression(value.A);
    //            r.SetExpression(value.R);
    //            g.SetExpression(value.G);
    //            b.SetExpression(value.B);
    //        }
    //    }
    //    [Browsable(false)]
    //    public Color ReversedColor
    //    {
    //        get { return Color.FromArgb(ReverseTransparency ? 255 - (int)a.Value : (int)a.Value, 255 - (int)r.Value, 255 - (int)g.Value, 255 - (int)b.Value); }
    //    }
    //    public override string ToString()
    //    {
    //        if ((int)a.Value == 255)
    //        {
    //            return string.Format("{0}, {1}, {2}", (int)r.Value, (int)g.Value, (int)b.Value);
    //        }
    //        else
    //        {
    //            return string.Format("{0}, {1}, {2}, {3}", (int)a.Value, (int)r.Value, (int)g.Value, (int)b.Value);
    //        }
    //    }
    //}
}
